# _*_ coding:utf-8 _*_
# 开发团队: Mavericks
# 开发人员：Maverick·Ming
# 开发IDE： PyCharm
#   项目名：HelloWorld
#   文件名：6.08 继承.py
# 开发时间：2021/3/26 11:48

# 继承

# 定义一个类Animal
#   这个类需要两个方法run()，sleep()
class Animal:

    def run(self):
        print("I'm running")

    def sleep(self):
        print("I'm running")


# Animal类能实现大部分功能sleep run，不能实现全部功能bark
# 为了实现全部功能，有三种方法
#   1.直接修改Animal,在类中添加bark（修改麻烦，违反OCP原则）
#   2.直接创建一个新的类Dog，包含sleep run bark （出现冗余代码）
#   3.直接从Animal类中继承run sleep ，Dog只实现其没有的功能bark
#       - 继承，是面向对象三大特性之一
#       - 通过继承是一个Dog类获取其他Animal类中的属性和方法为己用
#       - 在定义类时，直接Dog(Animal)（Animal是父类，超类、基类、super类）
#       - Dog是Animal的子类、衍生类，直接继承父类中的所有属性和方法

# 通过继承可以直接让子类Dog直接获得Animal父类的方法，不用修改类，符合OCP原则，避免了写重复性的代码
# 所以可以通过字类继承父类，在子类中添加方法来对类功能进行拓展

# 定义一个狗类，run() sleep() bark()
class Dog(Animal):

    # def run(self):
    #     print("I'm running")
    #
    # def sleep(self):
    #     print("I'm running")

    def bark(self):
        print("I'm braking!")


d = Dog()
d.bark()
d.run()
d.sleep()
# isinstance()用来检查一个实例对象d是否是另一个类对象的实例
r = isinstance(d, Dog)
print('d是否是Dog类型', r)
r = isinstance(d, Animal)
print('d是否是Animal类型', r)


# 创建一个哈士奇类
class Hashiqi(Dog):
    def chaijia(self):
        print('拆家DNA已激活！')


h = Hashiqi()
h.chaijia()
h.bark()
h.run()
h.sleep()
# isinstance()用来检查一个实例对象d是否是另一个类对象的实例
r = isinstance(h, Hashiqi)
print('h是否是Hashiqi类型', r)
r = isinstance(h, Dog)
print('h是否是Dog类型', r)
r = isinstance(h, Animal)
print('h是否是Animal类型', r)


# 在创建类时，如果省略了父类，则默认父类为object
# object是所有类的父类，所有类都继承自object类
# class person(object):  # object父类可省略
#     pass

# issubclass()用来检查一个类Animal是否是另一个类object的字类
print('object是Animal的父类', issubclass(Animal, object))
